//pTandem Library with two external inputs with RFP for testing

//Properties 
Property Name(txt);
Property RepressedBy(txt); 
Property Represses(txt);

//Part Types 
PartType Promoter(Name,RepressedBy); 
PartType Terminator(Name);
PartType RBS(Name);
PartType SmallMolecule(Name,Represses);
PartType CReporter(Name,Represses); 

//Parts 
RBS rbs("rbs");
CReporter RFP("RFP");
Terminator term("term"); 
Promoter pTet("pTet","tetR");
Promoter pLac("pLac","lacI");
Promoter pBad("pBad","araC");
SmallMolecule aTc("aTc","tetR");
SmallMolecule IPTG("IPTG","lacI");
SmallMolecule arabinose("arabinose","araC");

//Structural Rules 
Device D1(SmallMolecule,Promoter,SmallMolecule,Promoter,RBS,CReporter,Terminator);

//Content Rules
//Rule R1 defines that for each tandem promoter you must have two unique promoters
Rule R1(ON D1:
     	all_forward /\
      	NOT pTet MORETHAN 1 /\
       	NOT pLac MORETHAN 1 /\
       	NOT pBad MORETHAN 1
);  
  
//Cartesian product 
list1=product(D1);
println(list1);

